地图要素编辑 离线地图要素编辑Sample 在线地图要素编辑Sample
最后更新时间:2019年6月17日
地图要素编辑即对二维地图要素(点、线、区、注记)的添、删、改编辑功能。可以对移动端设备本地存储的离线数据进行编辑,也可以在联网状态下直接对在线地图服务、图层服务进行要素编辑。
要素添加
要素添加功能实现的关键步骤如下图所示:
(1) 构造要素编辑对象(FeatureEdit);
(2) 构造要素对象的三要素,包括属性(Attributes)、几何信息(Geometry)、样式信息(GeomInfo);
(3) 根据三要素创建要素(Feature);
(4) 调用要素编辑对象FeatureEdit的append方法执行添加要素。
接下来以离线地图数据点要素添加为例展示具体实现方法:
1
构造要素编辑要素对象有四种方式,根据应用模式分为离线数据编辑和在线数据编辑。用户可根据需求选择相应的方式。
(1)离线数据
Map map=aMapView.getMap(); VectorLayer vectorLayer =(VectorLayer) map.getLayer(i); FeatureEdit featureEdit= new FeatureEdit (vectorLayer);
//通过打开数据库来获取featureclass(通常在只提供.mgdb数据库时使用) String databasePath=FilePath.MAP_EDIT_DB_PATH; //.mgdb数据库所在的路径 DataBase database = new DataBase(); //构造数据库对象 database.open(databasePath); //打开数据库 SFeatureCls pointFeatureCls=new SFeatureCls(database); //获取简单要素类对象 featureCls.open(i); //打开简单要素类,参数为图层ID(从1开始) //构造要素编辑对象 if(featureCls != null && featureCls.hasOpen()){ pointEdit=new FeatureEdit(pointFeatureCls); }
(2)在线数据
在线数据编辑,首先需要在IGServer发布地图文档数据(.mapx),发布成功后获取地图文档信息,如地图文档名称、地图文档基地址、图层索引、图层URL等。在运行要素编辑功能时,需要确保设备网络与IGServer服务器网络连通。
private String IGServerBaseURL = "http://develop.smaryun.com:6163/igs"; //服务基地址 private String PointLayerURL="gdbp://MapGisLocal/武汉MKT/sfcls/自绘点"; //图层URL pointEdit=new FeatureEdit(IGServerBaseURL, PointLayerURL);
//基地址、地图文档名称、地图索引、图层索引 pointEdit=new FeatureEdit(IGServerBaseURL, "WuHanEdit", 0, 8);
2
包括属性信息(Attributes)、几何信息(Geometry)、样式信息(GeomInfo)。
java.util.HashMap<String, String> attributes=new HashMap<String, String>(); attributes.put("Name", "自定义站"); //属性值以键值对形式存在
//坐标点 Dot3D dot=new Dot3D(12727052.60, 3578030.02, 0); //几何点对象 GeoPoint point=new GeoPoint(dot);
//点样式信息对象 PntInfo pntInfo=new PntInfo(); pntInfo.setHeight(600); //高度 pntInfo.setWidth(600); //宽度 pntInfo.setSymID(177); //符号编号 pntInfo.setOutClr1(6); //颜色
重要说明:(1)设置的符号编号、颜色值是根据离线地图数据系统库中的符号库、颜色库来决定的(2)地图要素包括点、线、区、注记四种基本类型,具体可以分解为多种几何类型,在接口层面上,它们对应不同的几何对象类、样式信息类。如下图所示:
3
根据三要素创建地图要素。
Feature pointeature=new Feature(attributes, point, pntInfo);
4
调用要素编辑对象的append方法执行添加要素,并对添加结果进行判断。
long result = pointEdit.append(pointFeature);//执行点要素的添加操作 if (result > 0) { Toast.makeText(DocLayerEdit_Activity.this, "添加点成功", Toast.LENGTH_SHORT).show(); mapView.forceRefresh(); //刷新地图 } else { Toast.makeText(DocLayerEdit_Activity.this, "添加点失败", Toast.LENGTH_SHORT).show(); }
以上是点要素添加的整个流程,线、区、注记要素的添加实现方法基本一致,区别构造要素对象的三要素方式不同,如下所示:
//属性信息 HashMap<String, String> attributes=new HashMap<String, String>(); attributes.put("Name_chn", "1道路"); //几何信息 GeoVarLine geoLine=new GeoVarLine(); Dots dots=new Dots(); Dot dot1=new Dot(12718853.57, 3583174.04); Dot dot2=new Dot(12718935.33, 3574794.53); Dot dot3=new Dot(12725802.44, 3571647.10); dots.append(dot1); dots.append(dot2); dots.append(dot3); geoLine.setDots2D(dots); //样式信息 LinInfo linInfo=new LinInfo(); linInfo.setOutClr1(2);
//属性信息 HashMap<String, String> attributes=new HashMap<String, String>(); attributes.put("Name", "1水域"); //几何信息 GeoPolygon geoPolygon=new GeoPolygon(); Dots dots=new Dots(); Dot dot1=new Dot(12723229.57, 3570597.11); Dot dot2=new Dot(12725877.54, 3569563.15); Dot dot3=new Dot(12722750.42, 3564973.34); Dot dot4=new Dot(12719875.49, 3566032.53); dots.append(dot1); dots.append(dot2); dots.append(dot3); dots.append(dot4); dots.append(dot1); //每条线的点个数列表 IntList intList=new IntList(); intList.append(dots.size()); geoPolygon.setDots(dots, intList); //样式信息 RegInfo regInfo=new RegInfo(); regInfo.setFillClr(7); regInfo.setAngle(0); regInfo.setFillMode((short) 0); regInfo.setLibID((short) 1); regInfo.setOutPenW(5);
//属性信息 HashMap<String, String> annoAtt=new HashMap<String, String>(); annoAtt.put("Name", "长江"); //几何信息 GeoAnno textAnno=new TextAnno(); ((TextAnno) textAnno).setText("长江"); Dot dot=new Dot(12730310.39, 3586141.71); textAnno.setAnchorDot(dot); //样式信息 TextAnnInfo textAnnInfo=new TextAnnInfo(); textAnnInfo.setHeight(1000); textAnnInfo.setWidth(1000); textAnnInfo.setColor(4);
要素添加的展示效果如下图所示:
要素修改
要素修改,包括对地图要素(点、线、区、注记)的属性、几何以及样式信息的编辑,实现的关键步骤如下图所示:
(1) 构造要素编辑对象(FeatureEdit);
(2) 获取待修改要素的ID:获取方式有多种,可以利用地图查询功能获取(通过要素类Feature的getID()方法获取)。
(3) 构造要素对象需修改的三要素:几何信息、属性信息、几何图形信息;
(4) 修改要素:调用Feature.modifyFeatureValue方法修改;
(5) 要素更新:调用要素编辑对象FeatureEdit的update方法执行更新,并对修改结果进行判断。
//对要素修改属性、几何、样式信息 long a = feature.modifyFeatureValue(modiPointAtt, modiPoint, modiInfo); if (a > 0) { //更新要素(要素ID、要素对象) long b = pointEdit.update(id, feature); if (b > 0) { Toast.makeText(DocLayerEdit_Activity.this, "修改点要素成功", Toast.LENGTH_SHORT).show(); aMapView.forceRefresh(); //强制刷新地图 } else { Toast.makeText(DocLayerEdit_Activity.this, "修改点要素失败", Toast.LENGTH_SHORT).show(); } }
说明:在修改要素时,如果只需要对要素的属性、几何、样式信息中的部分信息进行修改,只需传入对应的信息对象即可,其他信息可传null。
要素删除
要素删除,同样分为点、线、区、注记要素的删除。要素删除通过要素的唯一标识ID定位要素,执行删除。要素删除功能实现的关键步骤如下图所示:
(1) 构造要素编辑对象(FeatureEdit);
(2) 获取要删除的要素的ID:要素ID一般通过地图要素查询方法获取;
(3) 要素删除:调用要素编辑对象的delete方法执行删除要素,并对删除结果进行判断。
//根据ID删除要素 long s = pointEdit.delete(id); if (s > 0) { Toast.makeText(DocLayerEdit_Activity.this, "删除点成功", Toast.LENGTH_SHORT).show(); aMapView.forceRefresh(); } else { Toast.makeText(DocLayerEdit_Activity.this, "删除点失败", Toast.LENGTH_SHORT).show(); }
草图交互式要素编辑 Sample详情
草图编辑器(SketchEditor),是MapGIS Mobile for Android SDK为开发者提供的用于快速绘制任意图形的工具,通过它,我们可以交互式绘制点、折线、流状线、区、流状区等图形,并且可以非常方便地修改图形,在实际项目应用中经常与地图要素编辑结合使用,打造简便、易用、高效、实用的功能应用。
在实现地图要素编辑功能应用时,草图编辑器可辅助用于绘制、修改地图要素的几何信息,其他的要素增加、删除、修改的功能还需自己实现。可参考示例中心的草图交互方式进行要素编辑的示例,在此对其中具体功能实现不展开讲述,草图编辑器的具体使用方法参考地图工具模块草图编辑器部分的详细讲解。展示效果如下图所示: